
/********************************************************************************
  * @file     SD93F115B_gpio.h   						    	
  * @author   TEST TEAM 												    	
  * @version  v0															    	
  * @date     Septemper 2022												    	
  * @brief 
  *           
  * Copyright (C) 2022  Hangzhou SDIC Microelectronics Co., Ltd  
*********************************************************************************/

#ifndef __SD93F115B_GPIO_H__
#define __SD93F115B_GPIO_H__

#ifdef __cplusplus
 extern "C" {
#endif

/* Exported types ------------------------------------------------------------*/
#include "SD93F115B.h"
  
/* GPIO*/
/* Exported types ------------------------------------------------------------*/

#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIO0)||\
                                    ((PERIPH) == GPIO1)||\
                                    ((PERIPH) == GPIO2)||\
                                    ((PERIPH) == GPIO3)||\
                                    ((PERIPH) == GPIO4)||\
                                    ((PERIPH) == GPIO5)||\
                                    ((PERIPH) == GPIO6)||\
                                    ((PERIPH) == GPIO7)||\
                                    ((PERIPH) == GPIO8))
									
#define IS_GPIO_LIST_PERIPH(PERIPH) (((PERIPH) == GPIO0)||\
                                     ((PERIPH) == GPIO8))									

/*GPIO Init structure definition  */

typedef enum
{
	
  GPIO_Mode_DI = 0x00,           /*!<  Digit port Mode */   // ???????????????????????
  GPIO_Mode_AN = 0x01,           /*!< Analog port Mode */
  GPIO_Mode_IN = 0x02,           /*!< GPIO Input Mode  */
  GPIO_Mode_OUT = 0x03           /*!< GPIO Output Mode */
  
}GPIOMode_TypeDef;

#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN)|| ((MODE) == GPIO_Mode_OUT) || \
                            ((MODE) == GPIO_Mode_DI)|| ((MODE) == GPIO_Mode_AN))
							
typedef enum
{
  GPIO_PuPd_NOPULL = 0x00,
  GPIO_PuPd_UP     = 0x01
  
}GPIOPuPd_TypeDef;

#define IS_GPIO_PUPD(PuPd) (((PuPd) == GPIO_PuPd_NOPULL)|| ((PuPd) == GPIO_PuPd_UP))

typedef enum
{
  GPIO_PTSR_WEAK = 0x00,
  GPIO_PTSR_STRONG = 0x01
  
}GPIOPTSR_TypeDef;

#define IS_GPIO_CURRENT(PTSR) (((PTSR) == GPIO_PTSR_WEAK)|| ((PTSR) == GPIO_PTSR_STRONG))

typedef struct
{
  uint8_t GPIO_Pin; 
  
  GPIOMode_TypeDef GPIO_Mode;
  
  GPIOPuPd_TypeDef GPIO_PuPd;
  	
  GPIOPTSR_TypeDef GPIO_PTSR;
  
}GPIO_InitTypeDef;

/* Exported constants -----------------------------------------------------*/

/********************************* GPIO_pins_define ********************************/

#define GPIO_Pin_0                  ((uint8_t)0x01)  /*!< Pin 0 selected    */
#define GPIO_Pin_1                  ((uint8_t)0x02)  /*!< Pin 1 selected    */
#define GPIO_Pin_2                  ((uint8_t)0x04)  /*!< Pin 2 selected    */
#define GPIO_Pin_3                  ((uint8_t)0x08)  /*!< Pin 3 selected    */
#define GPIO_Pin_4                  ((uint8_t)0x10)  /*!< Pin 4 selected    */
#define GPIO_Pin_5                  ((uint8_t)0x20)  /*!< Pin 5 selected    */
#define GPIO_Pin_6                  ((uint8_t)0x40)  /*!< Pin 6 selected    */
#define GPIO_Pin_7                  ((uint8_t)0x80)  /*!< Pin 7 selected    */
#define GPIO_Pin_All                ((uint8_t)0xFF)  /*!< Pin ALL selected  */

#define IS_GPIO_PIN(PIN) ((PIN) != (uint8_t)0x00)

#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || ((PIN) == GPIO_Pin_1) || \
                              ((PIN) == GPIO_Pin_2) || ((PIN) == GPIO_Pin_3) || \
                              ((PIN) == GPIO_Pin_4) || ((PIN) == GPIO_Pin_5) || \
                              ((PIN) == GPIO_Pin_6) || ((PIN) == GPIO_Pin_7) || \
							  ((PIN) == GPIO_Pin_All))
					
					
/************************** AI_pins_define ***********************************/
#define A0                  ((uint8_t)0x00)  /*!< A0 selected    */
#define A1                  ((uint8_t)0x01)  /*!< A1 selected    */
#define A2                  ((uint8_t)0x02)  /*!< A2 selected    */
#define A3                  ((uint8_t)0x03)  /*!< A3 selected    */
#define A4                  ((uint8_t)0x04)  /*!< A4 selected    */
#define A5                  ((uint8_t)0x05)  /*!< A5 selected    */
#define A6                  ((uint8_t)0x06)  /*!< A6 selected    */
#define A7                  ((uint8_t)0x07)  /*!< A7 selected    */
#define AIAll               ((uint8_t)0xFF)  /*!< AIALL selected */

#define IS_Analog_PIN(PIN) (((PIN) == A0) || ((PIN) == A1) || \
							((PIN) == A2) || ((PIN) == A3) || \
							((PIN) == A4) || ((PIN) == A5) || \
							((PIN) == A6) || ((PIN) == A7) || \
							((PIN) == AIAll))

/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */

void GPIO_DeInit(void);                                                                    //将GPIO相关寄存器初始化成上电默认值

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);                    //初始化GPIO

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);                                   //将GPIO的所有IO初始化为输入上拉态

/* GPIO Read and Write functions **********************************************/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin);                      //读取单个Pin的输入端口数据值
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);                                           //读取一组GPIO的输入端口数据值

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin);                     //读取单个Pin的输出端口数据值
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);                                          //读取一组GPIO的输出端口数据值

void GPIO_WriteOutputDataBit(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin,BitAction BitVal);      //写入单个Pin的输出端口数据值
void GPIO_WriteOutputData(GPIO_TypeDef* GPIOx, uint8_t PortVal);                           //写入一组GPIO的输出端口数据值

/*************************Analog Port functions***********************************************/
void GPIO_AIPuPdCmd(uint8_t Ax,FunctionalState NewState);                                  //使能或失能对应模拟口下拉到ACM上
void GPIO_VBGOutputCmd(FunctionalState NewState);                                          //使能或失能VBG从A4输出
void GPIO_VBGFOutputCmd(FunctionalState NewState);                                         //使能或失能VBGF从A5输出
void GPIO_IOUTPPortCmd(uint8_t Ax,FunctionalState NewState);                               //使能或失能IOUTP从Ax输出
void GPIO_IOUTNPortCmd(uint8_t Ax,FunctionalState NewState);                               //使能或失能IOUTN从Ax输出


#ifdef __cplusplus
}
#endif

#endif /* __SD93F115B_GPIO_H */


/****************************END OF FILE****************************/
